package com.leyou.item.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.leyou.common.pojo.PageResult;
import com.leyou.item.mapper.BrandMapper;
import com.leyou.item.pojo.Brand;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

@Service
public class BrandService {
    @Autowired
    private BrandMapper brandMapper;

    /**
     * 查询品牌页面-在这里进行实际处理
     *
     * @param key    查询关键词条可以是name模糊或者是首字母
     * @param page   当前页面
     * @param rows   显示多少条
     * @param sortBy 排序方依据
     * @param desc   desc排序方式 desc--false asc默认是升序true，mysql中1true0false
     * @return {@link PageResult}<{@link Brand}>
     */
    public PageResult<Brand> queryBrandsByPage(String key, Integer page, Integer rows, String sortBy, Boolean desc) {
        //JPA-Example根据自定义的命名规范拼接sql查询
        Example example = new Example(Brand.class);//查询的对象
        Example.Criteria criteria = example.createCriteria();//创建查询器

        //开始参数分析与处理

        //key是否空-名字像key或者首字母是key
        if (StringUtils.isNotBlank(key)) {
            criteria.andLike("name", "%" + key + "%").orEqualTo("letter", key);
        }
        //在这里开始分页-内置分页对象
        PageHelper.startPage(page, rows);
        //排序条件
        if (StringUtils.isNotBlank(sortBy)) {
            example.setOrderByClause(sortBy + " " + (desc ? "asc" : "desc"));//1-asc,
        }

        //sql查询
        List<Brand> brands = brandMapper.selectByExample(example);
        //PI--接收查询到的数据
        PageInfo<Brand> pageInfo = new PageInfo(brands);
        //用PI包装成分页结果集-内置List对象是一件分页好的数据
        return new PageResult<>(pageInfo.getTotal(), pageInfo.getList());
    }

    /**
     * 插入操作-查询，事务支持--要么成功提交，要么失败回滚，可以不判断返回值
     * Brand和Category多表操作，sql维护中间表
     * 新增品牌-返回值为空，响应状态码就可以post请求方式决定方法映射方式
     *
     * @param brand 接受品牌参数--pojo ?k=v，属性名和实体名一样，可以直接映射
     * @param cids  接受分类id集合,需要手动映射
     */
    @Transactional
    public void saveBrand(Brand brand, List<Long> cids) {
        //可以通过源码看到insertSelective是NOTNULL判断之后append
        //insert直接append,前者sql效率高，没有传值就不写入属性table('c1','c2') values()
        this.brandMapper.insertSelective(brand);

        cids.forEach((cid) -> this.brandMapper.insertCategoryAndBrand(brand.getId(), cid));

    }

    /**
     * 新增商品---查询品牌由cid分类--大量无法直接查询数据，通过分类筛选
     * 涉及到中间表自定义mapper方法
     *
     * @param cid cid
     * @return {@link List}<{@link Brand}>
     */
    public List<Brand> queryBrandsByCid(Long cid) {
        return this.brandMapper.queryBrandsByCid(cid);
    }


    /**
     * 查询品牌通过id
     */
    public Brand queryBrandById(Long id) {
        return brandMapper.selectByPrimaryKey(id);
    }
}
